#include <head.h>

// 函数声明
void *sem_func(void *val);

// 定义信号量
sem_t sem;

// 银行账户余额
int balance = 1000;

// 互斥锁
pthread_mutex_t mutex_t;

int main(int argc, char const *argv[])
{
    // 定义线程Tid 和 id
    pthread_t Tid[5];
    int ID_arr[5] = {1 , 2 , 3 , 4 , 5}; // 线程内部使用 展示自己是几号线程

    // 初始化
    pthread_mutex_init(&mutex_t, NULL);
    sem_init(&sem, 0, 2); // 允许最多两个客户同时取款

    // 创建线程
    for (int i = 0; i < 5; i++)
    {
        printf("用户%d 等待取款.....\n", i + 1);
        pthread_create(&Tid[i], NULL, sem_func, NULL);
    }

    sleep(2);

    // 回收线程
    for (int i = 0; i < 5; i++)
    {
        pthread_join(Tid[i], NULL);
    }

    // 销毁锁和信号量
    pthread_mutex_destroy(&mutex_t);
    sem_destroy(&sem);

    return 0;
}

void *sem_func(void *val)
{
    // P操作
    sem_wait(&sem);

    // 加锁
    pthread_mutex_lock(&mutex_t);

    // 检查余额是否足够
    if (balance >= 100)
    {
        balance -= 100;
        printf("取款成功 余额: %d\n", balance);
    }  
    else
    {
        printf("余额不足,取款失败\n");
    }
    sleep(2);
    // 解锁
    pthread_mutex_unlock(&mutex_t);

    // V操作
    sem_post(&sem);

    return NULL;
}